function numSubmat(mat) {
  const m = mat.length;
  const n = mat[0].length;
  let result = 0;

  // 高度数组，记录每个位置向上连续1的数量
  const height = new Array(n).fill(0);

  for (let i = 0; i < m; i++) {
    // 更新高度数组
    for (let j = 0; j < n; j++) {
      height[j] = mat[i][j] === 1 ? height[j] + 1 : 0;
    }

    // 计算当前行作为柱状图的矩形数量
    for (let j = 0; j < n; j++) {
      if (height[j] === 0) continue;

      // 记录当前位置能形成的最小高度
      let minHeight = height[j];
      // 加上1xminHeight的矩形
      result += minHeight;

      // 向左扩展，计算所有以当前位置为右边界的矩形
      for (let k = j - 1; k >= 0 && height[k] > 0; k--) {
        minHeight = Math.min(minHeight, height[k]);
        result += minHeight;
      }
    }
  }

  return result;
}

// 测试示例
console.log(
  numSubmat([
    [1, 0, 1],
    [1, 1, 0],
    [1, 1, 0],
  ])
); // 输出: 13
console.log(
  numSubmat([
    [0, 1, 1, 0],
    [0, 1, 1, 1],
    [1, 1, 1, 0],
  ])
); // 输出: 24
